﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Capa_Entidad;
using Capa_Negocio_Interface;
using Capa_Negocio_Facade;
using System.Xml;
using System.Text.RegularExpressions;
using DevExpress.Web.ASPxGridView;
using CrystalDecisions.CrystalReports.Engine;

public partial class Clinica_HistoriaClinicaListado : System.Web.UI.Page
{
    private static IFacadeRegistrarHistoriaClinica InterfaceRegistrarHistoriaClinica;
    private static List<V_His_Historia_Clinica_x_Paciente> ListarHistoriasClinicas = null;
    private static List<V_Atencion_x_Paciente> ListarAtencionxPaciente = null;
    private static IEnumerable<Object> ListarDiagnosticos = null;
    private static IEnumerable<Object> ListarExamenes = null;
    private static IEnumerable<Object> ListarHospitalizaciones = null;
    private static IEnumerable<Object> ListarMedicamentos = null;

    private static String msg, titulo;

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!IsPostBack)
            {

            }
            else {
                //Session["Reporte"] = reporte;
                CrystalReportViewer1.ReportSource = Session["Reporte"];
                
            }
        }
        catch (Exception ex)
        {
            titulo = "ERROR AL CARGAR LA PAGINA";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    private void CargarHistoriasClinicas()
    {
        try
        {
            LimpiardgvListadoHistoriaClinica();

            int? nroHC = null, vacio = null;
            String nroDNI, nomPAC;
            if (txtNroHC.Text.Trim() != "")
            {
                int nHC;
                if (!int.TryParse(txtNroHC.Text.Trim(), out nHC))
                {
                    msg = "El Nro de La Historia Clinica Solo Debe Contener Numeros";
                    MostrarComentario(msg);
                    return;
                }
                if (nHC <= 0)
                {
                    msg = "El Nro de La Historia No Debe Contener Letras Ni Caracteres Especiales";
                    MostrarComentario(msg);
                    return;
                }
                nroHC = nHC;
            }
            else { nroHC = vacio; }

            nroDNI = txtDNI.Text.Trim();
            if (nroDNI != "")
            {
                Regex regex = new Regex("^[0-9]+$");
                if (!regex.IsMatch(nroDNI))
                {
                    msg = "El DNI Debe Ser Contener Solo Numeros.";
                    MostrarComentario(msg);
                    return;
                }
            }

            nomPAC = txtnomPaciente.Text.Trim();
            if (nomPAC != String.Empty)
            {
                Regex regex = new Regex("^[a-zA-Z áéíóúAÉÍÓÚÑñ]+$");
                if (!regex.IsMatch(nomPAC))
                {
                    msg = "El Nombre y Apellidos Debe Contener Solo Letras.";
                    MostrarComentario(msg);
                    return;
                }
            }
            if (nroHC == null && nroDNI == String.Empty && nomPAC == String.Empty)
            {
                msg = "Debe Seleccionar Algun Filtro";
                MostrarComentario(msg);
                return;
            }


            ListarHistoriasClinicas = new List<V_His_Historia_Clinica_x_Paciente>();
            InterfaceRegistrarHistoriaClinica = new FacadeRegistrarHistoriaClinica();
            ListarHistoriasClinicas = InterfaceRegistrarHistoriaClinica.ListarHistoriasClinicas(nroHC, nroDNI, nomPAC);

            if (ListarHistoriasClinicas == null || ListarHistoriasClinicas.Count() == 0)
            {
                msg = "No Hay Datos Para La Busqueda Realizada.";
                MostrarComentario(msg);
                return;
            }

            dgvListadoHistoriaClinica.DataSource = ListarHistoriasClinicas;
            dgvListadoHistoriaClinica.DataBind();
            dgvListadoHistoriaClinica.SettingsDetail.AllowOnlyOneMasterRowExpanded = true;
        }
        catch (Exception ex)
        {
            titulo = "ERROR AL CARGAR LAS HISTORIAS CLINICAS";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    private void CargaAtencionxPaciente(int nroHC)
    {
        try
        {
            ListarAtencionxPaciente = new List<V_Atencion_x_Paciente>();
            InterfaceRegistrarHistoriaClinica = new FacadeRegistrarHistoriaClinica();
            ListarAtencionxPaciente = InterfaceRegistrarHistoriaClinica.listarAtencion(nroHC);

            if (ListarAtencionxPaciente == null || ListarAtencionxPaciente.Count() == 0)
            {
                msg = "No Hay Datos Para La Busqueda Realizada.";
                MostrarComentario(msg);
                return;
            }
        }
        catch (Exception ex)
        {
            Session["nroHC"] = null;
            titulo = "ERROR AL CARGAR LAS ATENCIONES DEL PACIENTE";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    private void CargaDetalleAtencion(int idAtencion, int? tipodgv)
    {
        try
        {
            LimpiardgvDiagnosticos(true);
            LimpiardgvExamenes(true);
            LimpiardgvHospitalizaciones(true);
            LimpiardgvMedicamentos(true);

            InterfaceRegistrarHistoriaClinica = new FacadeRegistrarHistoriaClinica();

            int? error = 0, vacio = null;
            switch (tipodgv)
            {
                case 0:
                    ListarDiagnosticos = new List<Object>();
                    ListarExamenes = new List<Object>();
                    ListarHospitalizaciones = new List<Object>();
                    ListarMedicamentos = new List<Object>();
                    ListarDiagnosticos = InterfaceRegistrarHistoriaClinica.listarDiagnosticos(idAtencion);
                    ListarExamenes = InterfaceRegistrarHistoriaClinica.listarExamenes(idAtencion);
                    ListarHospitalizaciones = InterfaceRegistrarHistoriaClinica.listarHospitalizaciones(idAtencion);
                    ListarMedicamentos = InterfaceRegistrarHistoriaClinica.listarMedicamentos(idAtencion);
                    break;
                case 1:
                    ListarDiagnosticos = new List<Object>();
                    ListarDiagnosticos = InterfaceRegistrarHistoriaClinica.listarDiagnosticos(idAtencion);
                    error = (ListarDiagnosticos == null || ListarDiagnosticos.Count() == 0) ? vacio : 0;
                    break;
                case 2:
                    ListarExamenes = new List<Object>();
                    ListarExamenes = InterfaceRegistrarHistoriaClinica.listarExamenes(idAtencion);
                    error = (ListarExamenes == null || ListarExamenes.Count() == 0) ? vacio : 0;
                    break;
                case 3:
                    ListarHospitalizaciones = new List<Object>();
                    ListarHospitalizaciones = InterfaceRegistrarHistoriaClinica.listarHospitalizaciones(idAtencion);
                    error = (ListarHospitalizaciones == null || ListarHospitalizaciones.Count() == 0) ? vacio : 0;
                    break;
                case 4:
                    ListarMedicamentos = new List<Object>();
                    ListarMedicamentos = InterfaceRegistrarHistoriaClinica.listarMedicamentos(idAtencion);
                    error = (ListarMedicamentos == null || ListarMedicamentos.Count() == 0) ? vacio : 0;
                    break;
                default:
                    error = null;
                    break;
            }
            if (error == null ||
                    (
                        (ListarDiagnosticos == null || ListarDiagnosticos.Count() == 0) &&
                        (ListarExamenes == null || ListarExamenes.Count() == 0) &&
                        (ListarHospitalizaciones == null || ListarHospitalizaciones.Count() == 0) &&
                        (ListarMedicamentos == null || ListarMedicamentos.Count() == 0)
                    )
                )
            {

                msg = "No Hay Datos Para La Atencion Solicitada.";
                MostrarComentario(msg);
                return;
            }

            switch (tipodgv)
            {
                case 0:
                    dgvDiagnosticos.DataSource = ListarDiagnosticos;
                    dgvDiagnosticos.DataBind();

                    dgvExamenes.DataSource = ListarExamenes;
                    dgvExamenes.DataBind();

                    dgvHospitalizaciones.DataSource = ListarHospitalizaciones;
                    dgvHospitalizaciones.DataBind();

                    dgvMedicamentos.DataSource = ListarMedicamentos;
                    dgvMedicamentos.DataBind();

                    break;
                case 1:
                    dgvDiagnosticos.DataSource = ListarDiagnosticos;
                    //dgvDiagnosticos.KeyFieldName = "ATE_ID_DIAGNOSTICO";
                    dgvDiagnosticos.DataBind();
                    break;
                case 2:
                    dgvExamenes.DataSource = ListarExamenes;
                    dgvExamenes.DataBind();
                    break;
                case 3:
                    dgvHospitalizaciones.DataSource = ListarHospitalizaciones;
                    dgvHospitalizaciones.DataBind();
                    break;
                case 4:
                    dgvMedicamentos.DataSource = ListarMedicamentos;
                    dgvMedicamentos.DataBind();
                    break;
                default:
                    error = null;
                    break;
            }

            ScriptManager.RegisterStartupScript(this, typeof(Page), "scriptkey", "pcDetalleAtencion.Show();", true);
        }
        catch (Exception ex)
        {
            titulo = "ERROR AL CARGAR EL DETALLE DE LA ATENCION";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    protected void BuscarHistoriaClinica(object sender, EventArgs e)
    {
        CargarHistoriasClinicas();
    }

    protected void LimpiarFiltros(object sender, EventArgs e)
    {
        Nuevo();
    }

    private void Nuevo()
    {
        try
        {
            txtNroHC.Text = String.Empty;
            txtDNI.Text = String.Empty;
            txtnomPaciente.Text = String.Empty;
            LimpiardgvListadoHistoriaClinica();
            LimpiardgvHospitalizaciones(false);
            dgvListadoHistoriaClinica.DetailRows.CollapseAllRows();
        }
        catch (Exception ex)
        {
            titulo = "ERROR AL LIMPIAR LOS CONTROLES";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    private void LimpiardgvListadoHistoriaClinica()
    {
        dgvListadoHistoriaClinica.Visible = true;
        dgvListadoHistoriaClinica.DataSource = null;
        dgvListadoHistoriaClinica.DataBind();
    }

    private void LimpiardgvDiagnosticos(Boolean estado)
    {
        dgvDiagnosticos.Visible = estado;
        dgvDiagnosticos.DataSource = null;
        dgvDiagnosticos.DataBind();
    }

    private void LimpiardgvExamenes(Boolean estado)
    {
        dgvExamenes.Visible = estado;
        dgvExamenes.DataSource = null;
        dgvExamenes.DataBind();
    }

    private void LimpiardgvHospitalizaciones(Boolean estado)
    {
        dgvHospitalizaciones.Visible = estado;
        dgvHospitalizaciones.DataSource = null;
        dgvHospitalizaciones.DataBind();
    }

    private void LimpiardgvMedicamentos(Boolean estado)
    {
        dgvMedicamentos.Visible = estado;
        dgvMedicamentos.DataSource = null;
        dgvMedicamentos.DataBind();
    }

    protected void MostrarHistorial(object sender, EventArgs e)
    {
        MostrarHistorial();
    }

    private void MostrarHistorial()
    {
        try
        {

            int index = dgvListadoHistoriaClinica.FocusedRowIndex;
            if (index == -1)
            {
                msg = "Debe Seleccionar Una Historia Clinica.";
                MostrarComentario(msg);
                return;
            }
            int nroHC = Convert.ToInt32(dgvListadoHistoriaClinica.GetRowValues(index, "GHC_NRO_HISTORIA_CLINICA"));
            Session["nroHC"] = nroHC;
            CargaAtencionxPaciente(nroHC);
        }
        catch (Exception ex)
        {
            Session["nroHC"] = null;
            titulo = "ERROR AL MOSTRAR EL HISTORIAL";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    protected void VerDetalleAtencion(object sender, EventArgs e)
    {
        VerDetalleAtencion(0);
    }

    private void VerDetalleAtencion(int? tipodgv)
    {
        try
        {
            int index_dgvLHC = dgvListadoHistoriaClinica.FocusedRowIndex;
            ASPxGridView dgvAtenciones = dgvListadoHistoriaClinica.FindDetailRowTemplateControl(index_dgvLHC, "dgvAtenciones") as ASPxGridView;
            int index = dgvAtenciones.FocusedRowIndex;
            if (index == -1)
            {
                msg = "Debe Seleccionar Una Atencion.";
                MostrarComentario(msg);
                return;
            }

            int idAtencion = Convert.ToInt32(dgvAtenciones.GetRowValues(index, "ATE_ID_ATENCION"));
            CargaDetalleAtencion(idAtencion, tipodgv);
        }
        catch (Exception ex)
        {
            titulo = "ERROR AL MOSTRAR EL DETALLE DE LA ATENCION";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    protected void dgvListadoHistoriaClinica_PageIndexChanged(object sender, EventArgs e)
    {
        CargarHistoriasClinicas();
    }

    protected void dgvListadoHistoriaClinica_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        CargarHistoriasClinicas();
    }

    protected void dgvAtenciones_PageIndexChanged(object sender, EventArgs e)
    {
        MostrarHistorial();
    }

    protected void dgvAtenciones_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        MostrarHistorial();
    }

    protected void dgvDiagnosticos_PageIndexChanged(object sender, EventArgs e)
    {
        VerDetalleAtencion(1);
    }

    protected void dgvDiagnosticos_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        VerDetalleAtencion(1);
    }

    protected void dgvExamenes_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        VerDetalleAtencion(2);
    }

    protected void dgvExamenes_PageIndexChanged(object sender, EventArgs e)
    {
        VerDetalleAtencion(2);
    }

    protected void dgvHospitalizaciones_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        VerDetalleAtencion(3);
    }

    protected void dgvHospitalizaciones_PageIndexChanged(object sender, EventArgs e)
    {
        VerDetalleAtencion(3);
    }

    protected void dgvMedicamentos_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        VerDetalleAtencion(4);
    }

    protected void dgvMedicamentos_PageIndexChanged(object sender, EventArgs e)
    {
        VerDetalleAtencion(4);
    }

    protected void dgvAtenciones_DataSelect(object sender, EventArgs e)
    {
        try
        {
            ASPxGridView grid = sender as ASPxGridView;
            int nroHC = Convert.ToInt32(grid.GetMasterRowFieldValues("GHC_NRO_HISTORIA_CLINICA").ToString());
            Session["nroHC"] = nroHC;
        }
        catch (Exception ex)
        {
            titulo = "ERROR AL OBTENER EL ID";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    protected void Mostrar(object sender, EventArgs e)
    {
        try
        {
            int index = dgvListadoHistoriaClinica.FocusedRowIndex;
            ASPxGridView dgvAtenciones = dgvListadoHistoriaClinica.FindDetailRowTemplateControl(index, "dgvAtenciones") as ASPxGridView;
            int indexDetail = dgvAtenciones.FocusedRowIndex;
            String values = dgvAtenciones.GetRowValues(indexDetail, "ATE_ID_ATENCION").ToString().Trim();
            int idAtencion = Convert.ToInt32(values);
            CargaDetalleAtencion(idAtencion, 0);
        }
        catch (Exception ex)
        {
            titulo = "ERROR AL MOSTRAR";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    protected void DetalleDiagnostico(object sender, EventArgs e)
    {
        VerDetallePopUp(1);
    }

    protected void DetalleExamenes(object sender, EventArgs e)
    {
        VerDetallePopUp(2);
    }

    protected void DetalleHospitalizaciones(object sender, EventArgs e)
    {
        VerDetallePopUp(3);
    }

    protected void DetalleMedicamentos(object sender, EventArgs e)
    {
        VerDetallePopUp(4);
    }

    private void VerDetallePopUp(int tipo)
    {
        try
        {
            if (tipo == 0)
            {
                msg = "No Se Ha Seleccionado Ningun Registro de Ninguna Tabla.";
                MostrarComentario(msg);
                return;
            }
            int index = 0;
            String cod = null, page = "";
            int id_atencion = 0;
            switch (tipo)
            {
                case 1:
                    index = dgvDiagnosticos.FocusedRowIndex;
                    cod = dgvDiagnosticos.GetRowValues(index, "ATD_ID_DIAGNOSTICO").ToString();
                    id_atencion = Convert.ToInt32(dgvListadoHistoriaClinica.GetRowValues(dgvListadoHistoriaClinica.FocusedRowIndex, "ATE_ID_ATENCION"));
                    page = "wfAtencion";
                    break;
                case 2:
                    index = dgvExamenes.FocusedRowIndex;
                    cod = dgvExamenes.GetRowValues(index, "ATE_ID_EXAMEN").ToString();
                    id_atencion = Convert.ToInt32(dgvListadoHistoriaClinica.GetRowValues(dgvListadoHistoriaClinica.FocusedRowIndex, "ATE_ID_ATENCION"));
                    page = "wfAtencion";
                    break;
                case 3:
                    index = dgvHospitalizaciones.FocusedRowIndex;
                    cod = dgvHospitalizaciones.GetRowValues(index, "REC_ID_RESERVACION_CAMAS").ToString();
                    id_atencion = Convert.ToInt32(dgvListadoHistoriaClinica.GetRowValues(dgvListadoHistoriaClinica.FocusedRowIndex, "ATE_ID_ATENCION"));
                    page = "wfAtencion";
                    break;
                case 4:
                    index = dgvMedicamentos.FocusedRowIndex;
                    cod = dgvMedicamentos.GetRowValues(index, "PRO_ID_PRODUCTO").ToString();
                    id_atencion = Convert.ToInt32(dgvListadoHistoriaClinica.GetRowValues(dgvListadoHistoriaClinica.FocusedRowIndex, "ATE_ID_ATENCION"));
                    page = "wfAtencion";
                    break;
            }

            if (cod == String.Empty)
            {
                msg = "No Existe Codigo Para El Registro Seleccionado";
                MostrarComentario(msg);
                return;
            }

            Session["IdAtencion"] = id_atencion;
            Session["Ate_Operacion"] = "M";
            Session["Ate_Operacion2"] = "P";
            String ruta = String.Format("~/Clinica/{0}.aspx", page);
            Response.Redirect(ruta, true);
        }
        catch (Exception ex)
        {
            titulo = "ERROR AL MOSTRAR EL DETALLE CONSULTADO";
            msg = ex.Message;
            MostrarComentario(msg, titulo);
        }
    }

    private void MostrarComentario(String msg, String titulo)
    {
        abrirAlerta(msg, titulo);
    }

    private void MostrarComentario(String msg)
    {
        abrirAlerta(msg, "Mensaje");
    }

    protected internal void abrirAlerta(String msg, String titulo)
    {
        pcMensaje.HeaderText = titulo;
        lblMensaje.Text = msg;
        ScriptManager.RegisterStartupScript(this, typeof(Page), "scriptkey", "pcMensaje.Show();", true);
    }
    protected void btnreporte_Click(object sender, EventArgs e)
    {
        InterfaceRegistrarHistoriaClinica = new FacadeRegistrarHistoriaClinica();
        int index = dgvListadoHistoriaClinica.FocusedRowIndex;
        if(index ==-1){
            lblMensaje.Text = "Seleccione un historial médico";
            ScriptManager.RegisterStartupScript(this, typeof(Page), "scriptkey", "pcMensaje.Show();", true);
            return;
        }
        string nroHC = (dgvListadoHistoriaClinica.GetRowValues(index, "GHC_NRO_HISTORIA_CLINICA")).ToString ();
        List<V_LISTA_PACIENTE_NROHISTORIA> lista =new  List<V_LISTA_PACIENTE_NROHISTORIA>();
       
        lista = InterfaceRegistrarHistoriaClinica.ListarNroPaciente(Convert.ToInt32(nroHC.Trim()));

        string IdPaciente = lista[0].PAC_ID_PACIENTE.ToString ();
        string ruta = Server.MapPath("RptHistorialClinico.rpt");
        ReportDocument reporte = new ReportDocument();
        reporte.Load(ruta);
        reporte.SetParameterValue("@IDHISTORIA", nroHC);
        reporte.SetParameterValue("@IdPaciente", IdPaciente);
        CrystalReportViewer1.ReportSource = reporte;
        //CrystalReportViewer1.RefreshReport ();
        Session["Reporte"] = reporte;
      
        ScriptManager.RegisterStartupScript(this, typeof(Page), "scriptkey", "PcReporte.Show();", true);

    }
}